package com.example.mybatisplusdemo.web.controller;

import com.example.mybatisplusdemo.common.JsonResponse;
import com.example.mybatisplusdemo.service.DestinationRecommendationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 目的地推荐控制器
 * </p>
 *
 * @author yangpengfei
 * @since 2025/01/20
 */
@Slf4j
@RestController
@RequestMapping("/api/destination")
@RequiredArgsConstructor
public class DestinationRecommendationController {

    private final DestinationRecommendationService destinationRecommendationService;

    /**
     * 获取热门目的地推荐
     * 
     * 业务逻辑说明：
     * 1. 根据出发地查询热门目的地
     * 2. 基于航班数据统计目的地热度
     * 3. 计算平均价格和航班频次
     * 4. 返回推荐目的地列表
     * 
     * @param departure 出发地机场代码，可选参数
     * @param limit 返回结果数量限制，默认10个
     * @return JsonResponse<Object> 包含热门目的地列表的响应对象
     */
    @GetMapping("/popular")
    public JsonResponse<Object> getPopularDestinations(
            @RequestParam(required = false) String departure,
            @RequestParam(defaultValue = "10") Integer limit) {
        try {
            log.info("获取热门目的地推荐，出发地: {}, 限制数量: {}", departure, limit);
            
            List<Map<String, Object>> destinations = destinationRecommendationService.getPopularDestinations(departure, limit);
            
            return JsonResponse.success(destinations);
        } catch (Exception e) {
            log.error("获取热门目的地推荐失败", e);
            return JsonResponse.failure("获取热门目的地推荐失败: " + e.getMessage());
        }
    }

    /**
     * 获取个性化目的地推荐
     *
     * 业务逻辑说明：
     * 1. 根据用户偏好参数进行筛选
     * 2. 基于预算范围过滤目的地
     * 3. 根据出行天数推荐合适的目的地
     * 4. 计算匹配度评分
     *
     * @param departure 出发地机场代码
     * @param minBudget 最小预算
     * @param maxBudget 最大预算
     * @param duration 出行天数
     * @param interests 兴趣标签，多个用逗号分隔
     * @return JsonResponse<Object> 包含个性化推荐列表的响应对象
     */
    @GetMapping("/personalized")
    public JsonResponse<Object> getPersonalizedRecommendations(
            @RequestParam String departure,
            @RequestParam(defaultValue = "0") Integer minBudget,
            @RequestParam(defaultValue = "20000") Integer maxBudget,
            @RequestParam(defaultValue = "5") Integer duration,
            @RequestParam(required = false) String interests) {
        try {
            log.info("获取个性化目的地推荐，出发地: {}, 预算: {}-{}, 天数: {}, 兴趣: {}",
                    departure, minBudget, maxBudget, duration, interests);

            List<Map<String, Object>> recommendations = destinationRecommendationService
                    .getPersonalizedRecommendations(departure, minBudget, maxBudget, duration, interests);

            return JsonResponse.success(recommendations);
        } catch (Exception e) {
            log.error("获取个性化目的地推荐失败", e);
            return JsonResponse.failure("获取个性化目的地推荐失败: " + e.getMessage());
        }
    }

    /**
     * 获取目的地详细信息
     *
     * 业务逻辑说明：
     * 1. 根据目的地机场代码查询详细信息
     * 2. 包含机场信息、城市信息、国家信息
     * 3. 统计相关航班信息
     * 4. 提供价格趋势数据
     *
     * @param destinationCode 目的地机场代码
     * @param departure 出发地机场代码，用于计算航班信息
     * @return JsonResponse<Object> 包含目的地详细信息的响应对象
     */
    @GetMapping("/detail")
    public JsonResponse<Object> getDestinationDetail(
            @RequestParam String destinationCode,
            @RequestParam(required = false) String departure) {
        try {
            log.info("获取目的地详细信息，目的地: {}, 出发地: {}", destinationCode, departure);

            Map<String, Object> detail = destinationRecommendationService
                    .getDestinationDetail(destinationCode, departure);

            return JsonResponse.success(detail);
        } catch (Exception e) {
            log.error("获取目的地详细信息失败", e);
            return JsonResponse.failure("获取目的地详细信息失败: " + e.getMessage());
        }
    }

    /**
     * 获取目的地价格地图数据
     *
     * 业务逻辑说明：
     * 1. 查询所有可达目的地
     * 2. 计算各目的地的平均价格
     * 3. 按价格区间分类
     * 4. 返回地图展示所需的数据格式
     *
     * @param departure 出发地机场代码
     * @return JsonResponse<Object> 包含价格地图数据的响应对象
     */
    @GetMapping("/price-map")
    public JsonResponse<Object> getPriceMapData(@RequestParam String departure) {
        try {
            log.info("获取目的地价格地图数据，出发地: {}", departure);

            Map<String, Object> priceMapData = destinationRecommendationService.getPriceMapData(departure);

            return JsonResponse.success(priceMapData);
        } catch (Exception e) {
            log.error("获取目的地价格地图数据失败", e);
            return JsonResponse.failure("获取目的地价格地图数据失败: " + e.getMessage());
        }
    }
}